/** @brief Fichier déclarant une classe qui gère la création d'un pixel.
 *
 * Ce fichier contient la déclaration de la classe Capteur, qui permet de
 * générer un pixel.
 *
 * @date 2014/01/17
 * @author Johan "Solo" Luisier
 */
#ifndef CAPTEUR_HPP
#define CAPTEUR_HPP

class Camera;

/** @brief Classe permettant de générer un pixel de l'image.
 *
 * Cette classe permet de générer un pixel de l'image, en effectuant le lancer
 * de rayon(s).
 *
 * Le but est de pouvoir stocker des instances dans un QVector, afin d'utiliser
 * la puissance de QtConcurrent pour accélérer la création de l'image. Dans un
 * premier temps, les instance seront simplement stockées dans un std::vector.
 *
 * @date 2014/01/17
 * @author Johan "Solo" Luisier
 *
 * @class Capteur "Capteur.hpp"
 */
class Capteur
{
public:
    /** @brief Constructeur, initialise les membres.
     *
     * Le constructeur assigne les coordonnées du point de l'image à rendre et
     * copie l'addresse de l'instance de Camera.
     *
     * @param[in] x coordonnée x du point de l'image.
     * @param[in] y coordonnée y du point de l'image.
     * @param[in] ptr pointeur sur l'instance de Camera à utiliser pour faire
     * le rendu.
     */
    Capteur( const unsigned& x, const unsigned& y, Camera* ptr );
    /** @brief Destructeur, libère la mémoire allouée.
     *
     * Le destructeur n'a rien de spécial à faire.
     */
    virtual ~Capteur();
    /** @brief Méthode qui génère le pixel.
     *
     * Cette méthode est responsable de générer la valeur de la couleur pour le
     * pixel voulu. En fait le travail est délégué à
     * Capteur::generePixelPrimaire ou Capteur::generePixelSecondaire suivant
     * que l'on fait le rendu primaire ou secondaire.
     */
    void generePixel();
protected:
    /** @brief Coordonnees contient les coordonnées du pixel qui sera calculé
     * par l'instance.
     *
     * Le stockage est @f$ \left[ x, y \right] @f$.
     */
    unsigned Coordonnees[ 2u ];
    /** @brief Pointeur sur l'instance de Camera à laquelle "appartient"
     * l'instance de Capteur.
     *
     * Ce pointeur permet d'accéder aux différentes information nécessaires
     * pour le rendu, ainsi qu'au "film" de la caméra.
     */
    Camera * PtrCamera;
private:
    /** @brief Constructeur par défaut, volontairement non défini.
     */
    Capteur();
    /** @brief Méthode responsable de générer le pixel "primaire", càd avant
     * tout post-traitement.
     *
     * Suivant le facteur d'oversampling (càd Camera::FacteurOversampling)
     * plusieurs rayons seront tirés et mélangés pour obtenir la valeur finale
     * du pixel.
     */
    void generePixelPrimaire();
    /** @brief Méthode responsable du post-rendu de l'image.
     *
     * Suivant la valeur de l'anti-aliasing, entre 4 et 16 rayons sont tirés et
     * mélangés pour obtenir la valeur finale du pixel.
     */
    void generePixelSecondaire();
};

#endif // CAPTEUR_HPP
